#include <iostream>
#include <cstdio>
#include <string>
#include <unistd.h>
#include <pthread.h>
#include <cstring>



void* thread_func(void* args)
{
    std::string s = static_cast<const char*> (args);
    std::cout << s << " detach itself" << std::endl;
    pthread_detach(pthread_self());
    while(1)
    {
        std::cout << s << " running" << std::endl;
        sleep(1);
    }
    return nullptr;
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, thread_func, (void*)"thread-1");
    sleep(3);
    int n = pthread_join(tid, nullptr);
    std::cerr << "n: " << n << " " << strerror(n) << std::endl;
    return 0;
}

// std::string FormatTid(const pthread_t& tid)
// {
//     char id[64];
//     snprintf(id, sizeof(id), "0x%lx", tid);
//     return id;
// }

// void* thread_func(void* args)
// {
//     std::string s = static_cast<const char*> (args);
//     while(1)
//     {
//         std::cout << s << " running!" << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, thread_func, (void*)"thread-1");

//     sleep(3);
//     std::cout << "cancel thread, tid: " << FormatTid(tid) << std::endl;
//     pthread_cancel(tid);

//     void* ret;
//     pthread_join(tid, &ret);
//     std::cout << "ret: " << (long long) ret << std::endl;

//     return 0;
// }


// void* thread_func(void* arg)
// {
//     std::string s = static_cast<const char*> (arg);
//     std::cout << s << " running" << std::endl;
//     return (void*)123;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, thread_func, (void*)"thread-1");

//     std::cout << "main thread start joining..." << std::endl;
//     void* ret;
//     pthread_join(tid, &ret);
//     std::cout << "ret: " << (long long)ret << std::endl;

// }

// class ThreadData
// {
// public:
//     ThreadData(const std::string& name, int a, int b)
//         : _name(name)
//         , _a(a)
//         , _b(b)
//     {}

//     int Excute() {return _a + _b;}
//     std::string Name(){return _name;}

//     ~ThreadData()
//     {}

// private:
//     std::string _name;
//     int _a, _b;
// };

// // 线程函数
// void* thread_func(void* arg) {
//     ThreadData *td = static_cast<ThreadData*>(arg);  
//     std::cout << td->Name() << " res: " << td->Excute() << std::endl;
//     return NULL;
// }

// int main() {
//     pthread_t threads[3];


//     for (long i = 0; i < 3; i++) {
//         std::string s = "thread-" + std::to_string(i);
//         ThreadData* td = new ThreadData(s, i, i + 1);
//         pthread_create(&threads[i], NULL, thread_func, (void*)td);
//     }

//     for (int i = 0; i < 3; i++) {
//         pthread_join(threads[i], NULL);
//     }

//     return 0;
// }




// // 声明一个线程局部变量
// __thread int thread_local_var = 0;

// // 线程函数
// void* thread_func(void* arg) {
//     thread_local_var = (long)arg;  // 将线程ID赋给线程局部变量
//     printf("Thread local variable in thread %ld: %d\n", (long)arg, thread_local_var);
//     return NULL;
// }

// int main() {
//     pthread_t threads[3];

//     // 创建三个线程
//     for (long i = 0; i < 3; i++) {
//         pthread_create(&threads[i], NULL, thread_func, (void*)i);
//     }

//     // 等待所有线程结束
//     for (int i = 0; i < 3; i++) {
//         pthread_join(threads[i], NULL);
//     }

//     return 0;
// }


// void* routine(void* args)
// {
//     std::string s = (const char*)args;
//     std::cout << s << " detach!" << std::endl;
//     int cnt = 5;
//     while(cnt--)
//     {
//         std::cout << s << " running" << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, routine, (void*)"thread-1");
    
//     pthread_detach(tid);
//     int cnt = 5;
//     while(cnt--)
//     {
//         std::cout << "main thread running!" << std::endl;
//         sleep(1);
//     }
    
//     int res = pthread_join(tid, nullptr);
//     if(res != 0)
//         std::cout << "pthread_join error: " << strerror(res) << std::endl;
//     else
//     std::cout << "pthread_join success" << std::endl;

//     return 0;
// }

// void showtid(pthread_t& tid)
// {
//     printf("tid: 0x%lx\n", tid);
// }


// std::string FormatTid(const pthread_t& tid)
// {
//     char id[64];
//     snprintf(id, sizeof(id), "0x%lx", tid);
//     return id;
// }

// void* routine(void* args)
// {
//     std::string s = static_cast<const char *>(args);
//     pthread_t tid = pthread_self();
//     int cnt = 5;
//     while(cnt--)
//     {
//         std::cout << "new thread, name: " << s << "id: " << FormatTid(tid) << std::endl;
//     }
//     return (void*)4396;
// }



// int main()
// {

//     pthread_t tid;
//     int n = pthread_create(&tid, nullptr, routine, (void*)"thread-1");
//     showtid(tid);
//     int cnt = 5;
//     while(cnt--)
//     {
//         std::cout << "main thread, id: " << FormatTid(pthread_self()) << std::endl; 
//     }
//     void* ret = nullptr;
//     pthread_join(tid, &ret);
//     std::cout << "ret: " << (long long)ret << std::endl;

//     return 0;
// }

// std::string FormatTid(const pthread_t& tid)
// {
//     char id[64];
//     snprintf(id, sizeof(id), "0x%lx", tid);
//     return id;
// }

// void* routine1(void* args)
// {
//     std::string s = static_cast<const char*>(args);
//     while(1)
//     {
//         std::cout << "new " << s << ", tid: " << FormatTid(pthread_self()) << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// void* routine2(void* args)
// {
//     std::string s = static_cast<const char*>(args);
//     while(1)
//     {
//         std::cout << "new " << s << ", tid: " << FormatTid(pthread_self()) << std::endl;
//         sleep(1);

//         int* ptr = nullptr;
//         *ptr = 10;
//     }
//     return nullptr;
// }


// int main()
// {
//     pthread_t tid1, tid2;
//     pthread_create(&tid1, nullptr, routine1, (void*)"thread-1");
//     pthread_create(&tid2, nullptr, routine2, (void*)"thread-2");
//     while(1)
//     {
//         std::cout << "main thread running" << std::endl;
//         sleep(1);
//     }

//     return 0;
// }



// void* threadrun(void* args)
// {
//     std::string s = (const char*)args;
//     while(1)
//     {
//         sleep(1);
//         std::cout << "new " << s << ", pid: " << getpid() << std::endl;
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadrun, (void*)"thread-1");

//     while(1)
//     {
//         std::cout << " main thread, pid: " << getpid() << std::endl;
//         sleep(1);
//     }

//     return 0;
// }